﻿using EasyTest.Shared.TestAttribute;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ZLGCANoptimize
{
    /***************************************************************************
    version:1.0
    创建人:xianle
    创建时间:2025/2/17 16:26:46
    *描述：
    *修 改 人：  
    *修改时间：  
    *修改描述：
   *=====================================================================*/
    public class 供应商
    {
        //[ExposedMethodAttribute("")]
        //public bool 硬件系统供应商标识号F18A(int 通道, out string 系统供应商标识号, out int 字节长度, out string 信息)
        //{
        //    系统供应商标识号 = "";
        //    字节长度 = 0;
        //    信息 = "";
        //    try
        //    {
        //        if (!数据.初始化(通道, out ZLGCANHelper zLGCANHelper))
        //        {
        //            信息 = "启动can设备失败";
        //            系统供应商标识号 = 信息;
        //            return false;
        //        }
        //        List<ZCAN_Receive_Data> zCAN_Receive_Datas = zLGCANHelper.RecvData(通道, 0x769, 300, 100);
        //        bool r1 = false, r2 = false;
        //        for (int i = 0; i < 3; i++)
        //        {
        //            r1 = zLGCANHelper.SentData(通道, 0x761, "03 22 F1 8A 00 00 00 00", true, SendType.正常发送);
        //            Thread.Sleep(60);
        //            r2 = zLGCANHelper.SentData(通道, 0x761, "30 08 14 00 00 00 00 00", true, SendType.正常发送);

        //            if (r1 && r2)
        //            {
        //                break;
        //            }
        //        }
        //        if (!r1 || !r2)
        //        {
        //            信息 = "发送失败...";
        //            系统供应商标识号 = 信息;
        //            return false;
        //        }
        //        zCAN_Receive_Datas = zLGCANHelper.RecvData(通道, 0x769, 3, 1500);
        //        string[] datas = ZLGCanTool.GetData(zCAN_Receive_Datas);

        //        string[] hexValues = new string[5];
        //        int num = 0;
        //        bool ok10 = false;
        //        bool ok21 = false;
        //        foreach (string s in datas)
        //        {
        //            if (s.Trim().StartsWith("10"))
        //            {
        //                ok10 = true;
        //                for (int i = 0; i < s.Split(' ').Length; i++)
        //                {
        //                    if (i < 5 || i > 7) continue;
        //                    hexValues[num] = s.Split(' ')[i];
        //                    num++;
        //                }
        //            }
        //            else if (s.Trim().StartsWith("21"))
        //            {
        //                ok21 = true;
        //                for (int i = 0; i < s.Split(' ').Length; i++)
        //                {
        //                    if (i == 0 || i > 2) continue;
        //                    hexValues[num] = s.Split(' ')[i];
        //                    num++;
        //                }
        //            }
        //        }
        //        var hexValuesStr = "";
        //        if (!ok10 || !ok21)
        //        {
        //            信息 = string.Join("", datas);
        //            系统供应商标识号 = 信息;
        //            return false;
        //        }


        //        foreach (String hex in hexValues)
        //        {
        //            int value = Convert.ToInt32(hex, 16);
        //            string stringValue = Char.ConvertFromUtf32(value);
        //            hexValuesStr += stringValue;
        //        }
        //        信息 = string.Join(",", datas);
        //        系统供应商标识号 = String.Join("", hexValues.ToList().GetRange(0, 4)).Trim() + "/" + hexValues[4];
        //        return true;
        //    }
        //    catch (Exception ex)
        //    {
        //        信息 = ex.Message;
        //        系统供应商标识号 = 信息;
        //        return false;
        //    }
        //    return true;
        //}
        [ExposedMethodAttribute("")]
        public bool 读系统供应商标识号F18A(int 通道, out string 系统供应商标识号, out int 字节长度, out string 信息)
        {
            系统供应商标识号 = "";
            字节长度 = 0;
            信息 = "";
            try
            {
                if (!数据.初始化(通道, out ZLGCANHelper zLGCANHelper))
                {
                    信息 = "启动can设备失败";
                    系统供应商标识号 = 信息;
                    return false;
                }
                List<ZCAN_Receive_Data> zCAN_Receive_Datas = zLGCANHelper.RecvData(通道, 0x769, 300, 100);
                bool r1 = false, r2 = false;
                for (int i = 0; i < 3; i++)
                {
                    r1 = zLGCANHelper.SentData(通道, 0x761, "03 22 F1 8A 00 00 00 00", true, SendType.正常发送);
                    Thread.Sleep(60);
                    r2 = zLGCANHelper.SentData(通道, 0x761, "30 08 14 00 00 00 00 00", true, SendType.正常发送);

                    if (r1 && r2)
                    {
                        break;
                    }
                }
                if (!r1 || !r2)
                {
                    信息 = "发送失败...";
                    系统供应商标识号 = 信息;
                    return false;
                }
                zCAN_Receive_Datas = zLGCANHelper.RecvData(通道, 0x769, 3, 1500);
                string[] datas = ZLGCanTool.GetData(zCAN_Receive_Datas);

                /*
                    10 08 62 F1 8A 18 02 71
                    21 36 00 AA AA AA AA AA
                */

                string[] hexValues = new string[5];
                int num = 0;
                bool ok10 = false;
                bool ok21 = false;
                foreach (string s in datas)
                {
                    if (s.Trim().StartsWith("10"))
                    {
                        ok10 = true;
                        for (int i = 0; i < s.Split(' ').Length; i++)
                        {
                            if (i < 5 || i > 7) continue;
                            hexValues[num] = s.Split(' ')[i];
                            num++;
                        }
                    }
                    else if (s.Trim().StartsWith("21"))
                    {
                        ok21 = true;
                        for (int i = 0; i < s.Split(' ').Length; i++)
                        {
                            if (i == 0 || i > 2) continue;
                            hexValues[num] = s.Split(' ')[i];
                            num++;
                        }
                    }
                }
                字节长度 = hexValues.Length;
                var hexValuesStr = "";
                if (!ok10 || !ok21)
                {
                    信息 = string.Join("", datas);
                    系统供应商标识号 = 信息;
                    return false;
                }

                foreach (String hex in hexValues)
                {
                    int value = Convert.ToInt32(hex, 16);
                    string stringValue = Char.ConvertFromUtf32(value);
                    hexValuesStr += stringValue;
                }
                信息 = string.Join(",", datas);
                系统供应商标识号 = String.Join("", hexValues.ToList().GetRange(0, 4)).Trim() + "/" + hexValues[4];
                return true;
            }
            catch (Exception ex)
            {
                信息 = ex.Message;
                系统供应商标识号 = 信息;
                return false;
            }
        }
        [ExposedMethodAttribute("")]
        public bool 读供应商硬件参考编号F192(int 通道, out string 供应商硬件参考编号Hex, out string 供应商硬件参考编号Asc, out int 字节长度, out string 信息)
        {
            供应商硬件参考编号Hex = "";
            供应商硬件参考编号Asc = "";
            字节长度 = 0;
            信息 = "";
            try
            {
                if (!数据.初始化(通道, out ZLGCANHelper zLGCANHelper))
                {
                    信息 = "启动can设备失败";
                    return false;
                }
                _ = zLGCANHelper.RecvData(通道, 0x769, 300, 100);
                Thread.Sleep(50);
                bool r1 = false, r2 = false;
                for (int i = 0; i < 5; i++)
                {
                    r1 = zLGCANHelper.SentData(通道, 0x761, "03 22 F1 92 00 00 00 00", true, SendType.正常发送);
                    Thread.Sleep(50);
                    r2 = zLGCANHelper.SentData(通道, 0x761, "30 08 14 00 00 00 00 00", true, SendType.正常发送);
                    if (r1 && r2)
                    {
                        break;
                    }
                }
                if (!r1 || !r2)
                {
                    信息 = "发送失败...";
                    供应商硬件参考编号Hex = 信息;
                    供应商硬件参考编号Asc = 信息;
                    return false;
                }
                List<ZCAN_Receive_Data> zCAN_Receive_Datas = zLGCANHelper.RecvData(通道, 0x769, 3, 1500);
                string[] datas = ZLGCanTool.GetData(zCAN_Receive_Datas);

                string[] hexValues = new string[13];
                int num = 0;
                bool ok10 = false;
                bool ok21 = false;
                /*
                 10 0D 62 F1 92 4D 03 01
                 21 00 52 24 07 22 00 00
                */
                foreach (string s in datas)
                {
                    if (s.Trim().StartsWith("10"))
                    {
                        ok10 = true;
                        for (int i = 0; i < s.Split(' ').Length; i++)
                        {
                            if (i < 5 || i > 7) continue;
                            hexValues[num] = s.Split(' ')[i];
                            num++;
                        }
                    }
                    if (s.Trim().StartsWith("21"))
                    {
                        ok21 = true;
                        for (int i = 0; i < s.Split(' ').Length; i++)
                        {
                            if (i < 1 || i > 7) continue;
                            hexValues[num] = s.Split(' ')[i];
                            num++;
                        }
                    }
                }
                字节长度 = hexValues.Length;
                var hexValues0 = "";
                if (!ok10 || !ok21)
                {
                    信息 = string.Join("", datas);
                    供应商硬件参考编号Hex = 信息;
                    供应商硬件参考编号Asc = 信息;
                    return false;
                }
                foreach (String hex in hexValues)
                {
                    int value = Convert.ToInt32(hex, 16);
                    string stringValue = Char.ConvertFromUtf32(value);
                    hexValues0 += stringValue;
                }
                信息 = string.Join(",", datas);
                供应商硬件参考编号Hex = string.Join("", hexValues);
                供应商硬件参考编号Asc = hexValues0;
                return ok10;
            }
            catch (Exception ex)
            {
                信息 = ex.Message;
                throw;
            }
        }
        [ExposedMethodAttribute("")]
        public bool 读系统供应商软件参考编号F194(int 通道, out string 系统供应商软件参考编号Hex, out string 系统供应商软件参考编号Asc, out int 字节长度, out string 信息)
        {
            系统供应商软件参考编号Hex = "";
            系统供应商软件参考编号Asc = "";
            字节长度 = 0;
            信息 = "";
            try
            {
                if (!数据.初始化(通道, out ZLGCANHelper zLGCANHelper))
                {
                    信息 = "启动can设备失败";
                    return false;
                }
                _ = zLGCANHelper.RecvData(通道, 0x769, 300, 100);
                Thread.Sleep(50);
                bool r1 = false, r2 = false;
                for (int i = 0; i < 5; i++)
                {
                    r1 = zLGCANHelper.SentData(通道, 0x761, "03 22 F1 94 00 00 00 00", true, SendType.正常发送);
                    Thread.Sleep(50);
                    r2 = zLGCANHelper.SentData(通道, 0x761, "30 08 14 00 00 00 00 00", true, SendType.正常发送);
                    if (r1 && r2)
                    {
                        break;
                    }
                }
                if (!r1 || !r2)
                {
                    信息 = "发送失败...";
                    系统供应商软件参考编号Hex = 信息;
                    系统供应商软件参考编号Asc = 信息;
                    return false;
                }
                List<ZCAN_Receive_Data> zCAN_Receive_Datas = zLGCANHelper.RecvData(通道, 0x769, 3, 1500);
                string[] datas = ZLGCanTool.GetData(zCAN_Receive_Datas);

                string[] hexValues = new string[13];
                int num = 0;
                bool ok10 = false;
                bool ok21 = false;
                /*
                    10 0D 62 F1 94 4D 03 01
                    21 19 52 24 07 25 00 00
                */
                foreach (string s in datas)
                {
                    if (s.Trim().StartsWith("10"))
                    {
                        ok10 = true;
                        for (int i = 0; i < s.Split(' ').Length; i++)
                        {
                            if (i < 5 || i > 7) continue;
                            hexValues[num] = s.Split(' ')[i];
                            num++;
                        }
                    }
                    if (s.Trim().StartsWith("21"))
                    {
                        ok21 = true;
                        for (int i = 0; i < s.Split(' ').Length; i++)
                        {
                            if (i < 1 || i > 7) continue;
                            hexValues[num] = s.Split(' ')[i];
                            num++;
                        }
                    }
                }
                字节长度 = hexValues.Length;
                var hexValues0 = "";
                if (!ok10 || !ok21)
                {
                    信息 = string.Join("", datas);
                    系统供应商软件参考编号Hex = 信息;
                    系统供应商软件参考编号Asc = 信息;
                    return false;
                }
                foreach (String hex in hexValues)
                {
                    int value = Convert.ToInt32(hex, 16);
                    string stringValue = Char.ConvertFromUtf32(value);
                    hexValues0 += stringValue;
                }
                信息 = string.Join(",", datas);
                系统供应商软件参考编号Hex = string.Join("", hexValues);
                系统供应商软件参考编号Asc = hexValues0;
                return ok10;
            }
            catch (Exception ex)
            {
                信息 = ex.Message;
                throw;
            }
        }
    }
}
